Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / helpers / ui / ST7735Display.cpp

Displaying Raw • Download

src/helpers/ui/ST7735Display.cpp 5732b2edd8563281ef7d344cd6517f969ca160ab (5732b2ed) Text, 20.98 KB

Tff7b72#Tff7b72include T8b949e"ST7735Display.h"

T8b949e//#include <Fonts/GFXFF/FreeSans9pt7b.h>

T8b949e// Optimised ST7735 display driver, derived from Adafruit_ST7735 library.

Tff7b72#Tff7b72define ST_CMD_DELAY 0x80 T8b949e// special signifier for command lists

Tff7b72#Tff7b72define ST77XX_NOP 0x00
Tff7b72#Tff7b72define ST77XX_SWRESET 0x01
Tff7b72#Tff7b72define ST77XX_RDDID 0x04
Tff7b72#Tff7b72define ST77XX_RDDST 0x09

Tff7b72#Tff7b72define ST77XX_SLPIN 0x10
Tff7b72#Tff7b72define ST77XX_SLPOUT 0x11
Tff7b72#Tff7b72define ST77XX_PTLON 0x12
Tff7b72#Tff7b72define ST77XX_NORON 0x13

Tff7b72#Tff7b72define ST77XX_INVOFF 0x20
Tff7b72#Tff7b72define ST77XX_INVON 0x21
Tff7b72#Tff7b72define ST77XX_DISPOFF 0x28
Tff7b72#Tff7b72define ST77XX_DISPON 0x29
Tff7b72#Tff7b72define ST77XX_CASET 0x2A
Tff7b72#Tff7b72define ST77XX_RASET 0x2B
Tff7b72#Tff7b72define ST77XX_RAMWR 0x2C
Tff7b72#Tff7b72define ST77XX_RAMRD 0x2E

Tff7b72#Tff7b72define ST77XX_PTLAR 0x30
Tff7b72#Tff7b72define ST77XX_TEOFF 0x34
Tff7b72#Tff7b72define ST77XX_TEON 0x35
Tff7b72#Tff7b72define ST77XX_MADCTL 0x36
Tff7b72#Tff7b72define ST77XX_COLMOD 0x3A

Tff7b72#Tff7b72define ST77XX_MADCTL_MY 0x80
Tff7b72#Tff7b72define ST77XX_MADCTL_MX 0x40
Tff7b72#Tff7b72define ST77XX_MADCTL_MV 0x20
Tff7b72#Tff7b72define ST77XX_MADCTL_ML 0x10
Tff7b72#Tff7b72define ST77XX_MADCTL_RGB 0x00

Tff7b72#Tff7b72define ST77XX_RDID1 0xDA
Tff7b72#Tff7b72define ST77XX_RDID2 0xDB
Tff7b72#Tff7b72define ST77XX_RDID3 0xDC
Tff7b72#Tff7b72define ST77XX_RDID4 0xDD

T8b949e// Some ready-made 16-bit ('565') color settings:
Tff7b72#Tff7b72define ST77XX_BLACK 0x0000
Tff7b72#Tff7b72define ST77XX_WHITE 0xFFFF
Tff7b72#Tff7b72define ST77XX_RED 0xF800
Tff7b72#Tff7b72define ST77XX_GREEN 0x07E0
Tff7b72#Tff7b72define ST77XX_BLUE 0x001F
Tff7b72#Tff7b72define ST77XX_CYAN 0x07FF
Tff7b72#Tff7b72define ST77XX_MAGENTA 0xF81F
Tff7b72#Tff7b72define ST77XX_YELLOW 0xFFE0
Tff7b72#Tff7b72define ST77XX_ORANGE 0xFC00


T8b949e// some flags for initR() :(
Tff7b72#Tff7b72define INITR_GREENTAB 0x00
Tff7b72#Tff7b72define INITR_REDTAB 0x01
Tff7b72#Tff7b72define INITR_BLACKTAB 0x02
Tff7b72#Tff7b72define INITR_18GREENTAB INITR_GREENTAB
Tff7b72#Tff7b72define INITR_18REDTAB INITR_REDTAB
Tff7b72#Tff7b72define INITR_18BLACKTAB INITR_BLACKTAB
Tff7b72#Tff7b72define INITR_144GREENTAB 0x01
Tff7b72#Tff7b72define INITR_MINI160x80 0x04
Tff7b72#Tff7b72define INITR_HALLOWING 0x05
Tff7b72#Tff7b72define INITR_MINI160x80_PLUGIN 0x06

T8b949e// Some register settings
Tff7b72#Tff7b72define ST7735_MADCTL_BGR 0x08
Tff7b72#Tff7b72define ST7735_MADCTL_MH 0x04

Tff7b72#Tff7b72define ST7735_FRMCTR1 0xB1
Tff7b72#Tff7b72define ST7735_FRMCTR2 0xB2
Tff7b72#Tff7b72define ST7735_FRMCTR3 0xB3
Tff7b72#Tff7b72define ST7735_INVCTR 0xB4
Tff7b72#Tff7b72define ST7735_DISSET5 0xB6

Tff7b72#Tff7b72define ST7735_PWCTR1 0xC0
Tff7b72#Tff7b72define ST7735_PWCTR2 0xC1
Tff7b72#Tff7b72define ST7735_PWCTR3 0xC2
Tff7b72#Tff7b72define ST7735_PWCTR4 0xC3
Tff7b72#Tff7b72define ST7735_PWCTR5 0xC4
Tff7b72#Tff7b72define ST7735_VMCTR1 0xC5

Tff7b72#Tff7b72define ST7735_PWCTR6 0xFC

Tff7b72#Tff7b72define ST7735_GMCTRP1 0xE0
Tff7b72#Tff7b72define ST7735_GMCTRN1 0xE1

T8b949e// Some ready-made 16-bit ('565') color settings:
Tff7b72#Tff7b72define ST7735_BLACK ST77XX_BLACK
Tff7b72#Tff7b72define ST7735_WHITE ST77XX_WHITE
Tff7b72#Tff7b72define ST7735_RED ST77XX_RED
Tff7b72#Tff7b72define ST7735_GREEN ST77XX_GREEN
Tff7b72#Tff7b72define ST7735_BLUE ST77XX_BLUE
Tff7b72#Tff7b72define ST7735_CYAN ST77XX_CYAN
Tff7b72#Tff7b72define ST7735_MAGENTA ST77XX_MAGENTA
Tff7b72#Tff7b72define ST7735_YELLOW ST77XX_YELLOW
Tff7b72#Tff7b72define ST7735_ORANGE ST77XX_ORANGE

Tff7b72static Te6edf3TFT_eSPI Te6edf3lcd Tff7b72= Te6edf3TFT_eSPITb4b4b4(T79c0ff160Tb4b4b4, T79c0ff80Tb4b4b4)Tb4b4b4;
Tff7b72static Tffa657uint32_t Te6edf3curr_colorTb4b4b4;

Tff7b72#Tff7b72if defined(HELTEC_LORA_V3) || defined(HELTEC_TRACKER_V2)
Tff7b72static Te6edf3SPIClass Td2a8fftft_spiTb4b4b4(Te6edf3HSPITb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72define _spi (&tft_spi)
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define _spi (&SPI1)
Tff7b72#Tff7b72endif

Te6edf3SPISettings Te6edf3_spiSettings Tff7b72= Te6edf3SPISettingsTb4b4b4(T79c0ff40000000Tb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4;

T8b949e// clang-format off
Tff7b72static Tff7b72const Tffa657uint8_t Te6edf3PROGMEM
Te6edf3BcmdTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// Init commands for 7735B screens
T79c0ff18Tb4b4b4, T8b949e// 18 commands in list:
Te6edf3ST77XX_SWRESETTb4b4b4, Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 1: Software reset, no args, w/delay
T79c0ff50Tb4b4b4, T8b949e// 50 ms delay
Te6edf3ST77XX_SLPOUTTb4b4b4, Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 2: Out of sleep mode, no args, w/delay
T79c0ff255Tb4b4b4, T8b949e// 255 = max (500 ms) delay
Te6edf3ST77XX_COLMODTb4b4b4, T79c0ff1Tff7b72+Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 3: Set color mode, 1 arg + delay:
T79c0ff0x05Tb4b4b4, T8b949e// 16-bit color
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST7735_FRMCTR1Tb4b4b4, T79c0ff3Tff7b72+Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 4: Frame rate control, 3 args + delay:
T79c0ff0x00Tb4b4b4, T8b949e// fastest refresh
T79c0ff0x06Tb4b4b4, T8b949e// 6 lines front porch
T79c0ff0x03Tb4b4b4, T8b949e// 3 lines back porch
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST77XX_MADCTLTb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 5: Mem access ctl (directions), 1 arg:
T79c0ff0x08Tb4b4b4, T8b949e// Row/col addr, bottom-top refresh
Te6edf3ST7735_DISSET5Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 6: Display settings #5, 2 args:
T79c0ff0x15Tb4b4b4, T8b949e// 1 clk cycle nonoverlap, 2 cycle gate
T8b949e// rise, 3 cycle osc equalize
T79c0ff0x02Tb4b4b4, T8b949e// Fix on VTL
Te6edf3ST7735_INVCTRTb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 7: Display inversion control, 1 arg:
T79c0ff0x0Tb4b4b4, T8b949e// Line inversion
Te6edf3ST7735_PWCTR1Tb4b4b4, T79c0ff2Tff7b72+Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 8: Power control, 2 args + delay:
T79c0ff0x02Tb4b4b4, T8b949e// GVDD = 4.7V
T79c0ff0x70Tb4b4b4, T8b949e// 1.0uA
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST7735_PWCTR2Tb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 9: Power control, 1 arg, no delay:
T79c0ff0x05Tb4b4b4, T8b949e// VGH = 14.7V, VGL = -7.35V
Te6edf3ST7735_PWCTR3Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 10: Power control, 2 args, no delay:
T79c0ff0x01Tb4b4b4, T8b949e// Opamp current small
T79c0ff0x02Tb4b4b4, T8b949e// Boost frequency
Te6edf3ST7735_VMCTR1Tb4b4b4, T79c0ff2Tff7b72+Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 11: Power control, 2 args + delay:
T79c0ff0x3CTb4b4b4, T8b949e// VCOMH = 4V
T79c0ff0x38Tb4b4b4, T8b949e// VCOML = -1.1V
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST7735_PWCTR6Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 12: Power control, 2 args, no delay:
T79c0ff0x11Tb4b4b4, T79c0ff0x15Tb4b4b4,
Te6edf3ST7735_GMCTRP1Tb4b4b4,T79c0ff16Tb4b4b4, T8b949e// 13: Gamma Adjustments (pos. polarity), 16 args + delay:
T79c0ff0x09Tb4b4b4, T79c0ff0x16Tb4b4b4, T79c0ff0x09Tb4b4b4, T79c0ff0x20Tb4b4b4, T8b949e// (Not entirely necessary, but provides
T79c0ff0x21Tb4b4b4, T79c0ff0x1BTb4b4b4, T79c0ff0x13Tb4b4b4, T79c0ff0x19Tb4b4b4, T8b949e// accurate colors)
T79c0ff0x17Tb4b4b4, T79c0ff0x15Tb4b4b4, T79c0ff0x1ETb4b4b4, T79c0ff0x2BTb4b4b4,
T79c0ff0x04Tb4b4b4, T79c0ff0x05Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x0ETb4b4b4,
Te6edf3ST7735_GMCTRN1Tb4b4b4,T79c0ff16Tff7b72+Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 14: Gamma Adjustments (neg. polarity), 16 args + delay:
T79c0ff0x0BTb4b4b4, T79c0ff0x14Tb4b4b4, T79c0ff0x08Tb4b4b4, T79c0ff0x1ETb4b4b4, T8b949e// (Not entirely necessary, but provides
T79c0ff0x22Tb4b4b4, T79c0ff0x1DTb4b4b4, T79c0ff0x18Tb4b4b4, T79c0ff0x1ETb4b4b4, T8b949e// accurate colors)
T79c0ff0x1BTb4b4b4, T79c0ff0x1ATb4b4b4, T79c0ff0x24Tb4b4b4, T79c0ff0x2BTb4b4b4,
T79c0ff0x06Tb4b4b4, T79c0ff0x06Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x0FTb4b4b4,
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 15: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x02Tb4b4b4, T8b949e// XSTART = 2
T79c0ff0x00Tb4b4b4, T79c0ff0x81Tb4b4b4, T8b949e// XEND = 129
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 16: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x02Tb4b4b4, T8b949e// XSTART = 1
T79c0ff0x00Tb4b4b4, T79c0ff0x81Tb4b4b4, T8b949e// XEND = 160
Te6edf3ST77XX_NORONTb4b4b4, Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 17: Normal display on, no args, w/delay
T79c0ff10Tb4b4b4, T8b949e// 10 ms delay
Te6edf3ST77XX_DISPONTb4b4b4, Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 18: Main screen turn on, no args, delay
T79c0ff255 Tb4b4b4}Tb4b4b4, T8b949e// 255 = max (500 ms) delay

Te6edf3Rcmd1Tb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 1 (red or green tab)
T79c0ff14Tb4b4b4, T8b949e// 14 commands in list:
T8b949e/*ST77XX_SWRESET, ST_CMD_DELAY, // 1: Software reset, 0 args, w/delay
150, */ T8b949e// 150 ms delay
Te6edf3ST77XX_SLPOUTTb4b4b4, Te6edf3ST_CMD_DELAYTb4b4b4, T8b949e// 2: Out of sleep mode, 0 args, w/delay
T79c0ff120Tb4b4b4, T8b949e// 120 ms delay
Te6edf3ST7735_FRMCTR1Tb4b4b4, T79c0ff3Tb4b4b4, T8b949e// 3: Framerate ctrl - normal mode, 3 arg:
T79c0ff0x01Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x2DTb4b4b4, T8b949e// Rate = fosc/(1x2+40) * (LINE+2C+2D)
Te6edf3ST7735_FRMCTR2Tb4b4b4, T79c0ff3Tb4b4b4, T8b949e// 4: Framerate ctrl - idle mode, 3 args:
T79c0ff0x01Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x2DTb4b4b4, T8b949e// Rate = fosc/(1x2+40) * (LINE+2C+2D)
Te6edf3ST7735_FRMCTR3Tb4b4b4, T79c0ff6Tb4b4b4, T8b949e// 5: Framerate - partial mode, 6 args:
T79c0ff0x01Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x2DTb4b4b4, T8b949e// Dot inversion mode
T79c0ff0x01Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x2DTb4b4b4, T8b949e// Line inversion mode
Te6edf3ST7735_INVCTRTb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 6: Display inversion ctrl, 1 arg:
T79c0ff0x07Tb4b4b4, T8b949e// No inversion
Te6edf3ST7735_PWCTR1Tb4b4b4, T79c0ff3Tb4b4b4, T8b949e// 7: Power control, 3 args, no delay:
T79c0ff0xA2Tb4b4b4,
T79c0ff0x02Tb4b4b4, T8b949e// -4.6V
T79c0ff0x84Tb4b4b4, T8b949e// AUTO mode
Te6edf3ST7735_PWCTR2Tb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 8: Power control, 1 arg, no delay:
T79c0ff0xC5Tb4b4b4, T8b949e// VGH25=2.4C VGSEL=-10 VGH=3 * AVDD
Te6edf3ST7735_PWCTR3Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 9: Power control, 2 args, no delay:
T79c0ff0x0ATb4b4b4, T8b949e// Opamp current small
T79c0ff0x00Tb4b4b4, T8b949e// Boost frequency
Te6edf3ST7735_PWCTR4Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 10: Power control, 2 args, no delay:
T79c0ff0x8ATb4b4b4, T8b949e// BCLK/2,
T79c0ff0x2ATb4b4b4, T8b949e// opamp current small & medium low
Te6edf3ST7735_PWCTR5Tb4b4b4, T79c0ff2Tb4b4b4, T8b949e// 11: Power control, 2 args, no delay:
T79c0ff0x8ATb4b4b4, T79c0ff0xEETb4b4b4,
Te6edf3ST7735_VMCTR1Tb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 12: Power control, 1 arg, no delay:
T79c0ff0x0ETb4b4b4,
Te6edf3ST77XX_INVOFFTb4b4b4, T79c0ff0Tb4b4b4, T8b949e// 13: Don't invert display, no args
Te6edf3ST77XX_MADCTLTb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 14: Mem access ctl (directions), 1 arg:
T79c0ff0xC8Tb4b4b4, T8b949e// row/col addr, bottom-top refresh
Te6edf3ST77XX_COLMODTb4b4b4, T79c0ff1Tb4b4b4, T8b949e// 15: set color mode, 1 arg, no delay:
T79c0ff0x05 Tb4b4b4}Tb4b4b4, T8b949e// 16-bit color

Te6edf3Rcmd2greenTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 2 (green tab only)
T79c0ff2Tb4b4b4, T8b949e// 2 commands in list:
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 1: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x02Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x7FTff7b72+T79c0ff0x02Tb4b4b4, T8b949e// XEND = 127
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 2: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x01Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x9FTff7b72+T79c0ff0x01 Tb4b4b4}Tb4b4b4, T8b949e// XEND = 159

Te6edf3Rcmd2redTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 2 (red tab only)
T79c0ff2Tb4b4b4, T8b949e// 2 commands in list:
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 1: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x7FTb4b4b4, T8b949e// XEND = 127
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 2: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x9F Tb4b4b4}Tb4b4b4, T8b949e// XEND = 159

Te6edf3Rcmd2green144Tb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 2 (green 1.44 tab)
T79c0ff2Tb4b4b4, T8b949e// 2 commands in list:
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 1: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x7FTb4b4b4, T8b949e// XEND = 127
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 2: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x7F Tb4b4b4}Tb4b4b4, T8b949e// XEND = 127

Te6edf3Rcmd2green160x80Tb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 2 (mini 160x80)
T79c0ff2Tb4b4b4, T8b949e// 2 commands in list:
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 1: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x4FTb4b4b4, T8b949e// XEND = 79
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 2: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x9F Tb4b4b4}Tb4b4b4, T8b949e// XEND = 159

Te6edf3Rcmd2green160x80pluginTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 2 (mini 160x80 with plugin FPC)
T79c0ff3Tb4b4b4, T8b949e// 3 commands in list:
Te6edf3ST77XX_INVONTb4b4b4, T79c0ff0Tb4b4b4, T8b949e// 1: Display is inverted
Te6edf3ST77XX_CASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 2: Column addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x4FTb4b4b4, T8b949e// XEND = 79
Te6edf3ST77XX_RASETTb4b4b4, T79c0ff4Tb4b4b4, T8b949e// 3: Row addr set, 4 args, no delay:
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T8b949e// XSTART = 0
T79c0ff0x00Tb4b4b4, T79c0ff0x9F Tb4b4b4}Tb4b4b4, T8b949e// XEND = 159

Te6edf3Rcmd2invertTb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// Tracker V1, part 2
T79c0ff1Tb4b4b4, T8b949e// 1 command in list:
Te6edf3ST77XX_INVONTb4b4b4, T79c0ff0 Tb4b4b4}Tb4b4b4, T8b949e// 1: Display is inverted

Te6edf3Rcmd3Tb4b4b4[Tb4b4b4] Tff7b72= Tb4b4b4{ T8b949e// 7735R init, part 3 (red or green tab)
T79c0ff2Tb4b4b4, T8b949e// 2 commands in list:
Te6edf3ST7735_GMCTRP1Tb4b4b4, T79c0ff16 Tb4b4b4, T8b949e// 1: Gamma Adjustments (pos. polarity), 16 args + delay:
T79c0ff0x02Tb4b4b4, T79c0ff0x1cTb4b4b4, T79c0ff0x07Tb4b4b4, T79c0ff0x12Tb4b4b4, T8b949e// (Not entirely necessary, but provides
T79c0ff0x37Tb4b4b4, T79c0ff0x32Tb4b4b4, T79c0ff0x29Tb4b4b4, T79c0ff0x2dTb4b4b4, T8b949e// accurate colors)
T79c0ff0x29Tb4b4b4, T79c0ff0x25Tb4b4b4, T79c0ff0x2BTb4b4b4, T79c0ff0x39Tb4b4b4,
T79c0ff0x00Tb4b4b4, T79c0ff0x01Tb4b4b4, T79c0ff0x03Tb4b4b4, T79c0ff0x10Tb4b4b4,
Te6edf3ST7735_GMCTRN1Tb4b4b4, T79c0ff16 Tb4b4b4, T8b949e// 2: Gamma Adjustments (neg. polarity), 16 args + delay:
T79c0ff0x03Tb4b4b4, T79c0ff0x1dTb4b4b4, T79c0ff0x07Tb4b4b4, T79c0ff0x06Tb4b4b4, T8b949e// (Not entirely necessary, but provides
T79c0ff0x2ETb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x29Tb4b4b4, T79c0ff0x2DTb4b4b4, T8b949e// accurate colors)
T79c0ff0x2ETb4b4b4, T79c0ff0x2ETb4b4b4, T79c0ff0x37Tb4b4b4, T79c0ff0x3FTb4b4b4,
T79c0ff0x00Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x10 Tb4b4b4}Tb4b4b4; T8b949e// 100 ms delay

Tff7b72static Tffa657int16_t Te6edf3_xstart Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Internal framebuffer X offset
Tff7b72static Tffa657int16_t Te6edf3_ystart Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Internal framebuffer Y offset
Tff7b72static Tffa657uint8_t Te6edf3_colstart Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Some displays need this changed to offset
Tff7b72static Tffa657uint8_t Te6edf3_rowstart Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Some displays need this changed to offset
Tff7b72static Tffa657uint8_t Te6edf3rotation Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72static Tffa657int16_t Te6edf3_width Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Display width as modified by current rotation
Tff7b72static Tffa657int16_t Te6edf3_height Tff7b72= T79c0ff0Tb4b4b4; T8b949e///< Display height as modified by current rotation

Tff7b72static Tffa657void Td2a8ffset_CSTb4b4b4(Tffa657uint8_t Te6edf3levelTb4b4b4) Tb4b4b4{
T8b949e//if (_cs != (uint8_t) -1) {
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_CSTb4b4b4, Te6edf3levelTb4b4b4)Tb4b4b4;
T8b949e//}
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffsendCommandTb4b4b4(Tffa657uint8_t Te6edf3comTb4b4b4) Tb4b4b4{
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_DCTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3comTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_DCTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffWriteDataTb4b4b4(Tffa657uint8_t Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_CSTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_CSTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffSPI_WRITE32Tb4b4b4(Tffa657uint32_t Te6edf3lTb4b4b4) Tb4b4b4{
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff24Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3lTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657void Td2a8ffwriteCommandTb4b4b4(Tffa657uint8_t Te6edf3cmdTb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_DCTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3cmdTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_DCTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffdisplayInitTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3addrTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3numCommandsTb4b4b4, Te6edf3cmdTb4b4b4, Te6edf3numArgsTb4b4b4;
Tffa657uint16_t Te6edf3msTb4b4b4;

Te6edf3numCommands Tff7b72= Te6edf3pgm_read_byteTb4b4b4(Te6edf3addrTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4; T8b949e// Number of commands to follow
Tff7b72while Tb4b4b4(Te6edf3numCommandsTff7b72-Tff7b72-Tb4b4b4) Tb4b4b4{ T8b949e// For each command...
Te6edf3cmd Tff7b72= Te6edf3pgm_read_byteTb4b4b4(Te6edf3addrTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4; T8b949e// Read command
Te6edf3numArgs Tff7b72= Te6edf3pgm_read_byteTb4b4b4(Te6edf3addrTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4; T8b949e// Number of args to follow
Te6edf3ms Tff7b72= Te6edf3numArgs Tff7b72& Te6edf3ST_CMD_DELAYTb4b4b4; T8b949e// If hibit set, delay follows args
Te6edf3numArgs Tff7b72&Tff7b72= Tff7b72~Te6edf3ST_CMD_DELAYTb4b4b4; T8b949e// Mask out delay bit
Te6edf3sendCommandTb4b4b4(Te6edf3cmdTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3k Tff7b72= T79c0ff0Tb4b4b4; Te6edf3k Tff7b72< Te6edf3numArgsTb4b4b4; Te6edf3kTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3WriteDataTb4b4b4(Te6edf3addrTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3addr Tff7b72+Tff7b72= Te6edf3numArgsTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3msTb4b4b4) Tb4b4b4{
Te6edf3ms Tff7b72= Te6edf3pgm_read_byteTb4b4b4(Te6edf3addrTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4; T8b949e// Read post-command delay time (ms)
Tff7b72if Tb4b4b4(Te6edf3ms Tff7b72=Tff7b72= T79c0ff255Tb4b4b4)
Te6edf3ms Tff7b72= T79c0ff500Tb4b4b4; T8b949e// If 255, delay for 500 ms
Te6edf3delayTb4b4b4(Te6edf3msTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffsetRotationTb4b4b4(Tffa657uint8_t Te6edf3mTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3madctl Tff7b72= T79c0ff0Tb4b4b4;

Te6edf3rotation Tff7b72= Te6edf3m Tff7b72& T79c0ff3Tb4b4b4; T8b949e// can't be higher than 3

Tff7b72switch Tb4b4b4(Te6edf3rotationTb4b4b4) Tb4b4b4{
Tff7b72case T79c0ff0Tb4b4b4:
Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_MX Tff7b72| Te6edf3ST77XX_MADCTL_MY Tff7b72| Te6edf3ST7735_MADCTL_BGRTb4b4b4;

Te6edf3_height Tff7b72= T79c0ff160Tb4b4b4;
Te6edf3_width Tff7b72= T79c0ff80Tb4b4b4;
Te6edf3_xstart Tff7b72= Te6edf3_colstartTb4b4b4;
Te6edf3_ystart Tff7b72= Te6edf3_rowstartTb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case T79c0ff1Tb4b4b4:
Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_MY Tff7b72| Te6edf3ST77XX_MADCTL_MV Tff7b72| Te6edf3ST7735_MADCTL_BGRTb4b4b4;

Te6edf3_width Tff7b72= T79c0ff160Tb4b4b4;
Te6edf3_height Tff7b72= T79c0ff80Tb4b4b4;
Te6edf3_ystart Tff7b72= Te6edf3_colstartTb4b4b4;
Te6edf3_xstart Tff7b72= Te6edf3_rowstartTb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case T79c0ff2Tb4b4b4:
Te6edf3madctl Tff7b72= Te6edf3ST7735_MADCTL_BGRTb4b4b4;

Te6edf3_height Tff7b72= T79c0ff160Tb4b4b4;
Te6edf3_width Tff7b72= T79c0ff80Tb4b4b4;
Te6edf3_xstart Tff7b72= Te6edf3_colstartTb4b4b4;
Te6edf3_ystart Tff7b72= Te6edf3_rowstartTb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case T79c0ff3Tb4b4b4:
Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_MX Tff7b72| Te6edf3ST77XX_MADCTL_MV Tff7b72| Te6edf3ST7735_MADCTL_BGRTb4b4b4;

Te6edf3_width Tff7b72= T79c0ff160Tb4b4b4;
Te6edf3_height Tff7b72= T79c0ff80Tb4b4b4;
Te6edf3_ystart Tff7b72= Te6edf3_colstartTb4b4b4;
Te6edf3_xstart Tff7b72= Te6edf3_rowstartTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}

Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72static Tffa657void Td2a8ffsetAddrWindowTb4b4b4(Tffa657uint16_t Te6edf3xTb4b4b4, Tffa657uint16_t Te6edf3yTb4b4b4, Tffa657uint16_t Te6edf3wTb4b4b4, Tffa657uint16_t Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3x Tff7b72+Tff7b72= Te6edf3_xstartTb4b4b4;
Te6edf3y Tff7b72+Tff7b72= Te6edf3_ystartTb4b4b4;
Tffa657uint32_t Te6edf3xa Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3x Tff7b72<Tff7b72< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3x Tff7b72+ Te6edf3w Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3ya Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3y Tff7b72<Tff7b72< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3y Tff7b72+ Te6edf3h Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_CASETTb4b4b4)Tb4b4b4; T8b949e// Column addr set
Te6edf3SPI_WRITE32Tb4b4b4(Te6edf3xaTb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_RASETTb4b4b4)Tb4b4b4; T8b949e// Row addr set
Te6edf3SPI_WRITE32Tb4b4b4(Te6edf3yaTb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_RAMWRTb4b4b4)Tb4b4b4; T8b949e// write to RAM
Tb4b4b4}

Tff7b72#Tff7b72define SCALE_X 1.25f T8b949e// 160 / 128
Tff7b72#Tff7b72define SCALE_Y 1.25f T8b949e// 80 / 64

Tff7b72static Te6edf3TFT_eSprite Tff7b72*Te6edf3sprite Tff7b72= Tffa657NULLTb4b4b4;

Tffa657bool Td2a8ffST7735Display::i2c_probeTb4b4b4(Te6edf3TwoWireTff7b72& Te6edf3wireTb4b4b4, Tffa657uint8_t Te6edf3addrTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657trueTb4b4b4;
T8b949e/*
wire.beginTransmission(addr);
uint8_t error = wire.endTransmission();
return (error == 0);
*/
Tb4b4b4}

Tff7b72#Tff7b72ifndef PIN_TFT_LEDA_CTL_ACTIVE
Tff7b72#Tff7b72define PIN_TFT_LEDA_CTL_ACTIVE HIGH
Tff7b72#Tff7b72endif

T8b949e// Color scheme
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3window_bkg Tff7b72= Te6edf3ST77XX_WHITETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3title_bkg Tff7b72= Te6edf3ST77XX_BLUETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3title_txt Tff7b72= Te6edf3ST77XX_WHITETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3primary_txt Tff7b72= Te6edf3ST77XX_BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3secondary_txt Tff7b72= Tb4b4b4(T79c0ff18 Tff7b72<Tff7b72< T79c0ff11Tb4b4b4) Tff7b72| Tb4b4b4(T79c0ff36 Tff7b72<Tff7b72< T79c0ff5Tb4b4b4) Tff7b72| T79c0ff18Tb4b4b4; T8b949e// mid-gray
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3warning_txt Tff7b72= Te6edf3ST77XX_ORANGETb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3popup_bkg Tff7b72= Te6edf3ST77XX_CYANTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3popup_txt Tff7b72= Te6edf3ST77XX_BLACKTb4b4b4;
Te6edf3ColorVal Te6edf3UIColorTff7b72:Tff7b72:Te6edf3corp_blue Tff7b72= T79c0ff0x001ATb4b4b4;

Tffa657bool Td2a8ffST7735Display::beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3spriteTb4b4b4) Tb4b4b4{
T8b949e// alloc offscreen canvas
Te6edf3sprite Tff7b72= Tff7b72new Te6edf3TFT_eSpriteTb4b4b4(Tff7b72&Te6edf3lcdTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3spriteTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3spriteTff7b72-Tff7b72>Te6edf3createSpriteTb4b4b4(T79c0ff160Tb4b4b4, T79c0ff80Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3fillScreenTb4b4b4(Te6edf3ST77XX_BLACKTb4b4b4)Tb4b4b4;
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setTextColorTb4b4b4(Te6edf3curr_color Tff7b72= Te6edf3ST77XX_WHITETb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ffST7735Display: failed to alloc canvas pixelsTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printfTb4b4b4(Ta5d6ff"Ta5d6ffST7735Display: failed to alloc canvasTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_isOnTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_peripher_powerTb4b4b4) Te6edf3_peripher_powerTff7b72-Tff7b72>Te6edf3claimTb4b4b4(Tb4b4b4)Tb4b4b4;

Te6edf3delayTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4; T8b949e// TEMP!!
Te6edf3pinModeTb4b4b4(Te6edf3PIN_TFT_RSTTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3pinModeTb4b4b4(Te6edf3PIN_TFT_CSTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3pinModeTb4b4b4(Te6edf3PIN_TFT_DCTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3pinModeTb4b4b4(Te6edf3PIN_TFT_LEDA_CTLTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72ifdef ESP_PLATFORM
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Te6edf3PIN_TFT_SCLTb4b4b4, T79c0ff-1 T8b949e/* _miso */Tb4b4b4, Te6edf3PIN_TFT_SDA T8b949e/* _mosi */Tb4b4b4, T79c0ff-1Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3_spiTff7b72-Tff7b72>Te6edf3setClockDividerTb4b4b4(Te6edf3SPI_CLOCK_DIV2Tb4b4b4)Tb4b4b4;

Te6edf3_height Tff7b72= T79c0ff80Tb4b4b4;
Te6edf3_width Tff7b72= T79c0ff160Tb4b4b4;
Tff7b72#Tff7b72if defined(HELTEC_LORA_V3) T8b949e// Tracker v1
Te6edf3_colstart Tff7b72= T79c0ff26Tb4b4b4;
Te6edf3_rowstart Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_colstart Tff7b72= T79c0ff24Tb4b4b4;
Te6edf3_rowstart Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif

Te6edf3_resetAndInitTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_DISPONTb4b4b4)Tb4b4b4;
Te6edf3_isOn Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::_resetAndInitTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Pulse Reset low for 10ms
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_RSTTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_RSTTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_RSTTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;

T8b949e// run init commands
Te6edf3displayInitTb4b4b4(Te6edf3Rcmd1Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if defined(HELTEC_TRACKER_V2) || defined(HELTEC_T096)
Te6edf3displayInitTb4b4b4(Te6edf3Rcmd2green160x80Tb4b4b4)Tb4b4b4;
T8b949e//uint8_t madctl = ST77XX_MADCTL_MY | ST77XX_MADCTL_MV |ST7735_MADCTL_BGR;//Adjust color to BGR
T8b949e//display.sendCommand(ST77XX_MADCTL, &madctl, 1);
Tff7b72#Tff7b72elif defined(HELTEC_LORA_V3) T8b949e// Tracker v1
Te6edf3displayInitTb4b4b4(Te6edf3Rcmd2invertTb4b4b4)Tb4b4b4; T8b949e// invert RGB
Tff7b72#Tff7b72endif
Te6edf3displayInitTb4b4b4(Te6edf3Rcmd3Tb4b4b4)Tb4b4b4;
Te6edf3setRotationTb4b4b4(Te6edf3DISPLAY_ROTATIONTb4b4b4)Tb4b4b4;
T8b949e// clear the buffer before display on
Te6edf3spriteTff7b72-Tff7b72>Te6edf3fillScreenTb4b4b4(Te6edf3ST77XX_BLACKTb4b4b4)Tb4b4b4;
Te6edf3endFrameTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// turn on backlight
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_LEDA_CTLTb4b4b4, Te6edf3PIN_TFT_LEDA_CTL_ACTIVETb4b4b4)Tb4b4b4;

Tb4b4b4}

Tffa657void Td2a8ffST7735Display::turnOnTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3_isOnTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_peripher_powerTb4b4b4) Te6edf3_peripher_powerTff7b72-Tff7b72>Te6edf3claimTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_resetAndInitTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_DISPONTb4b4b4)Tb4b4b4;

T8b949e// Now turn on the backlight
T8b949e// digitalWrite(PIN_TFT_LEDA_CTL, PIN_TFT_LEDA_CTL_ACTIVE);
Te6edf3_isOn Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::turnOffTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_isOnTb4b4b4) Tb4b4b4{
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_DISPOFFTb4b4b4)Tb4b4b4;

T8b949e//digitalWrite(PIN_TFT_RST, LOW);
T8b949e// Now turn off the backlight
Te6edf3digitalWriteTb4b4b4(Te6edf3PIN_TFT_LEDA_CTLTb4b4b4, Tff7b72!Te6edf3PIN_TFT_LEDA_CTL_ACTIVETb4b4b4)Tb4b4b4;
Te6edf3_isOn Tff7b72= Tffa657falseTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3_peripher_powerTb4b4b4) Te6edf3_peripher_powerTff7b72-Tff7b72>Te6edf3releaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::clearTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3fillScreenTb4b4b4(Te6edf3ST77XX_BLACKTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::startFrameTb4b4b4(Te6edf3ColorVal Te6edf3bkgTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3fillScreenTb4b4b4(Te6edf3bkgTb4b4b4)Tb4b4b4;
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setTextColorTb4b4b4(Te6edf3curr_color Tff7b72= Te6edf3UIColorTff7b72:Tff7b72:Te6edf3primary_txtTb4b4b4)Tb4b4b4;
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setFreeFontTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setTextSizeTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4; T8b949e// This one affects size of Please wait... message
T8b949e//sprite->cp437(true); // Use full 256 char 'Code Page 437' font
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::setTextSizeTb4b4b4(Tffa657int Te6edf3szTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setTextSizeTb4b4b4(Te6edf3szTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::setColorTb4b4b4(Te6edf3ColorVal Te6edf3cTb4b4b4) Tb4b4b4{
Te6edf3curr_color Tff7b72= Te6edf3cTb4b4b4;
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setTextColorTb4b4b4(Te6edf3curr_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::setCursorTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3setCursorTb4b4b4(Te6edf3xTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3yTff7b72*Te6edf3SCALE_YTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::printTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3strTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3printTb4b4b4(Te6edf3strTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::fillRectTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3fillRectTb4b4b4(Te6edf3xTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3yTff7b72*Te6edf3SCALE_YTb4b4b4, Te6edf3wTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3hTff7b72*Te6edf3SCALE_YTb4b4b4, Te6edf3curr_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::drawRectTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3drawRectTb4b4b4(Te6edf3xTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3yTff7b72*Te6edf3SCALE_YTb4b4b4, Te6edf3wTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3hTff7b72*Te6edf3SCALE_YTb4b4b4, Te6edf3curr_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::drawXbmTb4b4b4(Tffa657int Te6edf3xTb4b4b4, Tffa657int Te6edf3yTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3bitsTb4b4b4, Tffa657int Te6edf3wTb4b4b4, Tffa657int Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3spriteTff7b72-Tff7b72>Te6edf3drawBitmapTb4b4b4(Te6edf3xTff7b72*Te6edf3SCALE_XTb4b4b4, Te6edf3yTff7b72*Te6edf3SCALE_YTb4b4b4, Te6edf3bitsTb4b4b4, Te6edf3wTb4b4b4, Te6edf3hTb4b4b4, Te6edf3curr_colorTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657uint16_t Td2a8ffST7735Display::getTextWidthTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3strTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3spriteTff7b72-Tff7b72>Te6edf3textWidthTb4b4b4(Te6edf3strTb4b4b4) Tff7b72/ Te6edf3SCALE_XTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffST7735Display::endFrameTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// blit the canvas buffer to LCD
Te6edf3set_CSTb4b4b4(Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Tffa657uint16_t Te6edf3xTb4b4b4, Te6edf3yTb4b4b4;
Tffa657uint16_tTff7b72* Te6edf3pixels Tff7b72= Tb4b4b4(Tffa657uint16_t Tff7b72*Tb4b4b4) Tb4b4b4(Tb4b4b4(Te6edf3TFT_eSprite Tff7b72*Tb4b4b4) Te6edf3spriteTb4b4b4)Tff7b72-Tff7b72>Te6edf3getPointerTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3y Tff7b72= T79c0ff0Tb4b4b4; Te6edf3y Tff7b72< T79c0ff80Tb4b4b4; Te6edf3yTff7b72+Tff7b72+Tb4b4b4, Te6edf3pixels Tff7b72+Tff7b72= T79c0ff160Tb4b4b4) Tb4b4b4{
Te6edf3setAddrWindowTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3yTb4b4b4, T79c0ff160Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef ESP_PLATFORM
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferBytesTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4)Te6edf3pixelsTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* T79c0ff160Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3pixelsTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* T79c0ff160Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}

Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.08s